#ifndef __FILTER_H
#define __FILTER_H

#ifdef __cplusplus
extern "C"{
#endif

#include <stdint.h>
#include "arm_math.h"
#include "main.h"

#ifdef __cplusplus
}

#endif

/**
 * @brief 滤波算法命名空间
*/
namespace filter_alg_n
{
    typedef struct
    {
        // 滤波器系数
        float b0, b1, b2; // 分子系数
        float a1, a2;     // 分母系数

        // 状态变量
        float x1, x2; // 输入历史值（n-1, n-2）
        float y1, y2; // 输出历史值（n-1, n-2）
    } NotchFilter;
    void NotchFilter_Init(NotchFilter *filter,
                          float center_freq,
                          float bandwidth,
                          float sample_rate);
    float NotchFilter_Update(NotchFilter *filter, float input);
    
    /****************************一阶低通滤波******************************************** */

    // 一阶低通滤波参数
    typedef struct
    {
        float input;		 //输入数据
        float last_input; //上次数据
        float out;		 //滤波输出的数据
        float num;		 //滤波参数
    } first_order_filter_t;
    
    // 一阶低通滤波类
    class first_order_filter_c
    {
        public:
        float first_order_filter(float input);
        void first_order_filter_init(float num);
        void first_order_filter_clear(void);
        first_order_filter_c(float num);
        private:
        first_order_filter_t measure;
    };


    /**********************滑动均值滤波*************************************************** */
    
    //滑动均值滤波参数（浮点）
    typedef  struct
    {
        float Input;        //当前取样值
        int32_t count_num; //取样次数
        float Output;       //滤波输出
        float Sum;          //累计总和
        float FIFO[250];    //队列
        int32_t sum_flag;  //已经够250个标志
    }__attribute__((__packed__)) sliding_mean_filter_t;

    //滑动均值滤波类
    class sliding_mean_filter_c
    {
        public:
        sliding_mean_filter_c();
        void sliding_mean_filter_init();                      //均值滑窗滤波初始化（可不用，直接定义结构体时给初值）
        float sliding_mean_filter(float Input, int num); //均值滑窗滤波
        
        private:
        sliding_mean_filter_t measure;
    };
    // 递推平均滤波参数
    typedef  struct
    {
        int32_t count_num;
        float fifo[50];
        float sum;
    } Recursive_ave_filter_type_t;
     /* 递推平均滤波 */
    float Recursive_ave_filter(Recursive_ave_filter_type_t *filter, float input, int num);
    float Recursive_ave_filter_init(Recursive_ave_filter_type_t *filter);
}

#endif // !__FILTER_H
